import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import os
import numpy as np
import pandas as pd


PATH = 'Z:\\autoEmail\\'
SENDER = 'dfcw@orientsec.com.cn'
PASSWORD = 'Ddcw2010'
sourcePrex = {'mao': '汇总', 'capital':'成本法汇总','system': '场外期权合约表_', 'AXZQ': '安信估值_东方证券股份有限公司', 'ZTZQ': '东方证券场外期权估值表', 'swap-index': '指数互换','swap': '互换'}

def getSendEmailStr(df,text=''):
    colnames = df.columns
    data = df.values
    dataStr = ""
    dataStr += '''
               <p>您好:</p>
               <p>下文是风控指标报表, 请查收。</p>
               <p></p>
               <table border="1" cellpadding="0" cellspacing="0" width="1800" style="border-collapse: collapse;">
               <tbody>
                <tr>
               '''

    for col in colnames:
        dataStr += '''
                   <th>{0}</th>
                   '''.format(col)

    dataStr += '''
                </tr>
               '''
    for i in range(data.shape[0]):
        dataStr += '''
                    <tr>
                   '''
        pass
        for j in range(data.shape[1]):
            dataStr += '''
                        <td  style="text-align:center"> {0} </td>
                       '''.format(data[i][j])
            pass
        dataStr += '''
                    </tr>
                   '''
    if text != '':
        dataStr += '''
                    </tbody>
                    </table>
                    <p>{0}</p>
                    <p></p>
                    <p></p>
                    <p>以下免责声明，请您务必仔细阅读：</p>
                    <p>东方证券提供的衍生品合约价值报告仅供参考，请贵方审慎核对该报告后使用，如有疑问请及时沟通、反馈。东方证券不对贵方使用合约价值报告产生的结果承担责任；合约价值报告因政策法规变化、自然灾害、系统故障、行情传输错误等不可抗力出现延迟、中断、错误等，东方证券不承担责任。</p>
                    <p>东方证券提供的衍生品合约价值报告不应作为任何资产管理产品进行任何份额或权益变更的依据；若任何资产管理产品基于该合约价值报告等信息进行开放申购、赎回等份额或权益变更操作，东方证券不对该等操作的公允性和法律适当性承担任何责任。</p>
                    <p>东方证券提供的衍生品合约价值报告基于东方证券内部模型计算得出，该内部模型的调整、优化由东方证券自行决定。</p>
                    <p>东方证券提供的衍生品合约价值报告仅提供给贵方作查照，非出于本邮件实现之目的的转发无效，贵方不可随意泄露给除外包机构、托管机构或投资顾问以外等无关的第三方。</p>
                    <p></p>
                    <p></p>
                    <p>注：本邮件为自动发送，如有任何问题，请联系xgxg@orientsec.com.cn，我们将在收到邮件后3个工作日内处理。</p>
                    '''.format(text)
    else:
        dataStr += '''
                    </tbody>
                    </table>
                    <p></p>
                    <p>以下免责声明，请您务必仔细阅读：</p>
                    <p>东方证券提供的衍生品合约价值报告仅供参考，请贵方审慎核对该报告后使用，如有疑问请及时沟通、反馈。东方证券不对贵方使用合约价值报告产生的结果承担责任；合约价值报告因政策法规变化、自然灾害、系统故障、行情传输错误等不可抗力出现延迟、中断、错误等，东方证券不承担责任。</p>
                    <p>东方证券提供的衍生品合约价值报告不应作为任何资产管理产品进行任何份额或权益变更的依据；若任何资产管理产品基于该合约价值报告等信息进行开放申购、赎回等份额或权益变更操作，东方证券不对该等操作的公允性和法律适当性承担任何责任。</p>
                    <p>东方证券提供的衍生品合约价值报告基于东方证券内部模型计算得出，该内部模型的调整、优化由东方证券自行决定。</p>
                    <p>东方证券提供的衍生品合约价值报告仅提供给贵方作查照，非出于本邮件实现之目的的转发无效，贵方不可随意泄露给除外包机构、托管机构或投资顾问以外等无关的第三方。</p>
                    <p></p>
                    <p></p>
                    <p>注：本邮件为自动发送，如有任何问题，请联系xgxg@orientsec.com.cn，我们将在收到邮件后3个工作日内处理。</p>
                    '''
    return dataStr
    pass

def sendMail(myDict):
    date = myDict['date']
    result = myDict['result']
    try:
        text=myDict['text']
    except:
        text=''
    if list(result.values) == []:
        constract = myDict['idList']
        print(f'合约{constract}对应的邮件内容缺失，请检查后重试！')
    else:
        dataStr = getSendEmailStr(result,text)
        subject = myDict['subject']
        targetEmail = myDict['targetEmail']
        ACCEPTER = ''
        for item in targetEmail:
            ACCEPTER += item + ','
        ACCEPTER = ACCEPTER[:-1]

        excelFile = PATH + str(date) + '\\' + subject + str(date) + '.xlsx'
        # df['label'] = round(df['label'], 2)
        mail_msg = dataStr
        EMS = MIMEMultipart()
        textApart = MIMEText(mail_msg, 'html', 'utf-8')
        excelApart = MIMEApplication(open(excelFile, 'rb').read())
        excelApart.add_header('Content-Disposition', 'attachment', filename=subject + str(date) + '.xlsx')
        EMS.attach(textApart)
        EMS.attach(excelApart)
        # 设置发件人信息
        EMS['From'] = Header(SENDER)
        # 设置收件人信息
        EMS['To'] = Header(ACCEPTER)
        # 设置邮件主题
        EMS['Subject'] = Header(subject, 'utf-8')

        try:
            smtpObj = smtplib.SMTP('smg.orientsec.com.cn')
            smtpObj.login(SENDER, PASSWORD)
            smtpObj.sendmail(SENDER, targetEmail, EMS.as_string())
            print("邮件发送成功")
        except smtplib.SMTPException:
            print("Error: 无法发送邮件")
        pass

def GetData(date, acceptDict):
    # 提取acceptDict参数
    idList = acceptDict['idList']
    sendtype = acceptDict['sendtype']
    date = str(date)
    files = os.listdir(PATH)
    if files == []:
        print('路径文件夹读取为空，请检查文件夹路径是否错误！')

    try:
        sourceFileName = os.path.join(PATH, sourcePrex['mao'] + str(date) + '.xlsx')
        maodf = pd.read_excel(sourceFileName)
        maodf = maodf[maodf['产品代码'].isin(idList)]
        maodf = maodf[maodf['估值日期'] == date[:4] + '/' + date[4:6] + '/' + date[6:]]
        maodf.sort_values(by="产品代码", ascending=False)
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')
    try:
        sourceFileName = os.path.join(PATH, sourcePrex['capital'] + str(date) + '.xlsx')
        capdf = pd.read_excel(sourceFileName)
        capdf = capdf[capdf['产品代码'].isin(idList)]
        capdf = capdf[capdf['估值日期'] == date[:4] + '/' + date[4:6] + '/' + date[6:]]
        capdf.sort_values(by="产品代码", ascending=False)
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')
    try:
        sourceFileName = os.path.join(PATH,sourcePrex['system'] + str(date)[0:4] + '-' + str(date)[4:6] + '-' + str(date)[6:8] + '.xlsx')
        sysdf = pd.read_excel(sourceFileName, engine='xlrd')
        label_position = sysdf[sysdf.日期 == '日期'].index.tolist()
        sysdf = pd.read_excel(sourceFileName, skiprows=label_position[0] + 1, engine='xlrd')
        sysdf = sysdf[sysdf['确认书编号（双方约定）'].isin(idList)]
        sysdf.sort_values(by="确认书编号（双方约定）", ascending=False)
        sysdf = sysdf[sysdf['存续'] == '是']
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')
    try:
        sourceFileName = os.path.join(PATH,sourcePrex['AXZQ'] + str(date)[0:4] + '-' + str(date)[4:6] + '-' + str(date)[6:8] + '.xls')

        axzqdf = pd.read_excel(sourceFileName)
        axzqdf = axzqdf[axzqdf['交易确认书编号'].isin(idList)]
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')
    try:
        sourceFileName = os.path.join(PATH, sourcePrex['ZTZQ'] + str(date) + '.xlsx')
        ztzqdf = pd.read_excel(sourceFileName)
        ztzqdf = ztzqdf[ztzqdf['合约编号'].isin(idList)]
        ztzqdf.sort_values(by="合约编号", ascending=False)
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')
    try:
        sourceFileName = os.path.join(PATH, sourcePrex['swap-index'] + str(date) + '.xlsx')
        spdf = pd.read_excel(sourceFileName)
        label_position = spdf[spdf.产品标的 == '交易确认书编号'].index.tolist()
        spdf = pd.read_excel(sourceFileName, skiprows=label_position[0] + 1)
        spdf = spdf[spdf['交易确认书编号'].isin(idList)]
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')
    try:
        sourceFileName = os.path.join(PATH, sourcePrex['swap'] + str(date) + '.xlsx')
        swapdf = pd.read_excel(sourceFileName)
        swapdf = swapdf[swapdf['合约编号'].isin(idList)]
    except:
        print(f'文件{sourceFileName}不在路径文件夹中，请检查文件是否存放正确！')


    result = pd.DataFrame()

    if sendtype == "snowballoptions-SHZQ":
        capdf.rename(columns={'收益凭证名称': '买方（产品名称）', '产品代码': '交易/合约编号', '投资金额': '名义本金', '浮动损益': '合约盈亏', '估值日期': '日期'}, inplace=True)
        capdf['券商名称'] = '东方证券'
        # maodf['标的']=list(sysdf['标的证券'])
        capdf = capdf[['券商名称', '买方（产品名称）', '交易/合约编号', '名义本金', 'cashDelta', 'cashVega', '日期']]
        capdf['名义本金'] = round(capdf['名义本金'], 2)
        capdf['cashDelta'] = round(capdf['cashDelta'], 2)
        capdf['cashVega'] = round(capdf['cashVega'], 2)
        result = capdf
    else:
        pass

    OUTPUTPATH = PATH + str(date) + '\\'
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(OUTPUTPATH)
    # 判断结果P
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(OUTPUTPATH)
    excelFile = OUTPUTPATH + acceptDict['subject'] + str(date) + '.xlsx'
    result.to_excel(excelFile, encoding='utf-8', index=False, header=True)
    acceptDict['result'] = result
    return (acceptDict)

def ToAddress(Agents, Self, config=False):
    acceptDictList = []
    if config == True:
        acceptDictList = Agents
    else:
        acceptDictList = Self
    return acceptDictList
########################################################################################################
if __name__ == '__main__':
    dateList = ['20220805']
    acceptDictList_Self = [
########################################################################################################
                         # 每天发送
########################################################################################################
                    # 周一发上周五  
                   {"idList": ['SHZQ-O20220804801'], 'targetEmail': ['xgxg@orientsec.com.cn'], 'sendtype': 'snowballoptions-SHZQ','subject':'东方-上海证券场外期权风控指标（雪球期权）','text':'注：该指标系根据我司自有模型计算所得，不作为估值依据，仅供参考。'},
########################################################################################################
                    # 周五发周四
########################################################################################################
                    # 月初发上月末
                    #{"idList": ['SHZQ-O20220804801'], 'targetEmail': ['xgxg@orientsec.com.cn'], 'sendtype': 'snowballoptions-SHZQ','subject':'东方-上海证券场外期权估值（雪球期权）','marginList':[0],'text':'注：该估值系根据双方共同协商确定的方法所作估值，仅供参考，不作为双方损益计算和结算依据。双方损益计算和结算以双方共同签署的交易确认书约定为准。'},
                        ]
########################################################################################################
    acceptDictList_Agents = [
########################################################################################################
                    # 每天发送
########################################################################################################
                    # 周一发上周五
########################################################################################################
                       # 周五发周四
########################################################################################################
                   # 月初发上月末
                      ]
    #下一行False为给自己发送.True为发送给客户
    acceptDictList = ToAddress(acceptDictList_Agents, acceptDictList_Self, config = False)
    myDictList = []
    for date in dateList:
        for acceptDict in acceptDictList:
            try:
                data=GetData(date, acceptDict)
                data['date']=date
                myDictList.append(data)
            except:
                id = acceptDict['idList']
                data={'idList':id}
                data['date']=date
                data['result']=pd.DataFrame()
                myDictList.append(data)

    for myDict in myDictList:
        sendMail(myDict)




